\mode<article>{
\chapter{Algoritme dan Pemrograman} \label{ch:algoritme-dan-pemrograman}
%%\lecture{Algoritme dan Pemrograman}{bab 1}
%\input{chAlgoritma-content}
}

\mode*

%\ifslide{
\ifthenelse{\boolean{adaTIU}}{
	\begin{footnotesize}
		\begin{description}
			\item[Tujuan Pembelajaran]:
			\begin{itemize}
				\item Memberikan pengertian tentang pentingnya pengetahuan pemrograman dalam teknologi informasi
				\item Memberikan pengertian tentang proses yang harus dilakukan dalam membuat suatu program
				\item Memberikan pengertian tentang Algoritma, Pseudocode dan Program
			\end{itemize}
			\item[Setelah menyelesaikan modul ini mahasiswa diharapkan dapat]:
			\begin{itemize}
				\item Menuliskan tahap-tahap dalam pembuatan program
				\item Menuliskan langkah-langkah yang ada pada algoritma
				\item Menulis algoritma dengan menggunakan flowchart dan pseudocode 
				\item Menuliskan algoritma untuk suatu masalah sederhana
				\item Menuliskan hal-hal yang perlu dilakukan untuk menerjemahkan algoritma menjadi program
				\item Menuliskan ciri-ciri suatu program terstruktur
				\item Menjelaskan fungsi dari translator
				\item Menjelaskan pentingnya dokumentasi program
			\end{itemize}
			\item[Kata kunci]:
			
			Algoritma, Pemrograman Terstruktur, Program, Pseudocode, Translator, Kode Sumber, Kode Biner
			\bigskip
		\end{description}
	\end{footnotesize}
}
%}


\section{Pendahuluan}

Misalkan anda diberikan $N$ bilangan bulat dan diminta untuk menentukan bilangan ke-$k$ terbesar di antaranya. Dalam hal ini kita asumsikan $k \leq N$. Masalah ini disebut sebagai masalah pemilihan \index{selection problem@\emph{selection problem}!masalah komputasi} (\emph{selection problem}). Ada beberapa alternatif yang dapat dilakukan untuk memecahkan \index{masalah komputasi} \index{computational problem@\emph{computational problem}} masalah komputasi ini. Kita bisa lebih dulu melakukan pengurutan data terhadap $N$ bilangan tersebut, kemudian mengambil bilangan ke-$k$ dari bilangan-bilangan yang sudah terurut. Jika kita memilih cara seperti ini, berarti kita harus lebih dulu memecahkan sebuah masalah komputasi yang lain, yaitu \index{pengurutan data!masalah komputasi} pengurutan data (\emph{sorting}).

Alternatif pemecahan lain untuk masalah pemilihan adalah kita ambil $k$ bilangan pertama dari bilangan-bilangan yang diberikan, dan kita masukkan ke dalam sebuah barisan bilangan. $k$ bilangan ini kita urutkan. Karena kita mengasumsikan nilai $k$ lebih kecil atau sama dengan $N$, kita bisa berharap usaha yang diperlukan untuk mengurutkan $k$ bilangan adalah lebih mudah daripada mengurutkan $N$ bilangan. Setelah $k$ bilangan tersebut kita urutkan, kita akan dapatkan bilangan yang berada di urutan paling kanan (di akhir barisan dari $k$ bilangan) adalah bilangan ke-$k$ terbesar di antara $k$ bilangan yang kita pilih pertama kali tadi.

Selanjutnya yang perlu kita lakukan adalah mengambil satu bilangan dari $(N-k)$ bilangan yang masih tersisa. Jika bilangan ini lebih kecil daripada bilangan dalam barisan bilangan
Untuk mengurutkan $N$ bilangan, maka bilangan tersebut bisa kita abaikan. Namun jika sebaliknya yang terjadi, maka kita ganti saja bilangan pada urutan ke-$k$ tersebut. Hal ini kita lakukan lagi dengan mengambil bilangan berikutnya yang masih tersisa hingga seluruh $N$ bilangan tersebut selesai kita periksa. Pada akhirnya bilangan di urutan ke-$k$ adalah bilangan ke-$k$ terbesar yang dicari.

Kedua alternatif pemecahan di atas melibatkan penggunaan \emph{sorting}. Untuk mengurutkan data, kita juga dihadapkan pada beberapa alternatif. Misalkan anda diberikan satu bilangan tertentu, dan anda diminta untuk mengurutkan bilangan tersebut. Dalam kasus ini, tentu saja anda tidak perlu melakukan pekerjaan apa pun karena satu buah bilangan otomatis bisa kita katakan sudah terurut. Bilangan tunggal tersebut tidak memiliki bilangan lain sebagai pembanding sehingga kita tidak perlu melakukan perbandingan dengan bilangan lain untuk memeriksa apakah sudah terurut atau belum.

Jika anda diberikan dua buah bilangan, dan diminta untuk mengurutkan kedua bilangan ini, anda harus melakukan sedikit usaha. Anda perlu membandingkan mana di antara kedua bilangan tersebut yang nilainya lebih kecil, lalu letakkan bilangan itu di urutan pertama. Jika anda diminta untuk mengurutkan tiga buah bilangan, usaha yang harus anda lakukan sedikit lebih banyak. Pertama anda ambil dua bilangan pertama, bandingkan mana di antar kedua bilangan tersebut yang lebih kecil, dan letakkan pada urutan pertama. Bilangan yang tersisa dapat anda bandingkan dengan bilangan ketiga untuk ditentukan mana yang nilainya paling kecil. Bilangan ini kemudian anda letakkan pada urutan kedua. Bilangan yang ketiga secara otomatis pasti akan menempati urutan ketiga.

Dari pembahasan sejauh ini, anda dapat memecahkan persoalan yang diberikan dalam langkah-langkah yang sederhana. Anda juga tidak perlu menggunakan langkah-langkah yang terlalu rumit. Namun jika jumlah bilangan yang anda perlu urutkan semakin banyak, anda mulai menghadapi beberapa pilihan langkah pemecahan. Misalkan sekarang anda diminta untuk mengurutkan 10 bilangan. Setidaknya ada dua alternatif pemecahan yang dapat anda pilih:
\begin{itemize}
  \item Anda periksa setiap pasangan bilangan mulai dari dua bilangan pertama. Jika di antara dua bilangan dalam setiap pasangan anda temukan bilangan pertama lebih besar daripada bilangan kedua, maka anda menukarkan tempat kedua bilangan tersebut. Lalu anda ambil lagi dua bilangan berikutnya, lakukan pemeriksaan apakah di antara kedua bilangan ini perlu ditukar tempatnya atau tidak. Hal ini terus anda lakukan sampai tidak ada pasangan bilangan yang perlu ditukar tempatnya.
  \item Anda tentukan bilangan terbesar dari ke-10 bilangan tersebut, lalu letakkan bilangan ini pada urutan ke-10. Kemudian anda cari lagi bilangan terbesar dari 9 bilangan yang tersisa, setelah ditemukan letakkan dia pada urutan ke-9. Lakukan ini berulang kali hingga seluruh bilangan selesai diperiksa.
\end{itemize}

Pertanyaan yang perlu kita perhatikan dari pembahasan sejauh ini adalah di antara alternatif-alternatif pemecahan masalah tersebut, mana alternatif yang memberikan pemecahan dalam waktu sesingkat mungkin? Dalam buku ini kita akan membahas secara detil bagaimana kita dapat menentukan seberapa cepat sebuah algoritma menyelesaikan permasalahan komputasi.

\mode<all>{
\section{Superkomputer vs PC}
}

Sekarang misalkan kita sudah membuat program komputer untuk masing-masing algoritma pengurutan di atas, dan diberikan pilihan untuk menjalankan kedua program tersebut pada dua komputer berbeda. \mode<all>{Komputer $A$ memiliki prosesor dengan kemampuan menjalankan 100 juta instruksi per detik, sementara komputer $B$ hanya mampu menjalankan 1 juta instruksi per detik.}

Di lain sisi, kita sudah membuat dua program komputer untuk mengurutkan $n$ bilangan. Program $X$ dapat mengurutkan $n$ bilangan dengan menjalankan $2 n^2$ \footnote{Rincian tentang bagaimana mendapatkan ekspresi $2 n^2$ dan $50 n \lg n$ akan diberikan kemudian.} instruksi, sementara program $Y$ dapat menyelesaikan pengurutan $n$ bilangan setelah menjalankan $50 n \lg n$ instruksi \footnote{Notasi $\lg$ di sini adalah logaritma basis 2, berbeda dengan $\log$, yang merupakan logaritma basis 10.}. Program $X$ kita jalankan pada komputer $A$, sedangkan program $Y$ kita jalankan pada komputer $B$. Kepada kedua program ini kita berikan 1 juta bilangan untuk diurutkan. Pertanyaannya adalah, komputer mana yang lebih dahulu menyelesaikan pengurutan data?

Jika dilihat sekilas, komputer $A$ lebih cepat 100 kali daripada komputer $B$. Akan tetapi perhitungan sederhana menunjukkan bahwa kenyataan yang terjadi sungguh berbeda. Jika dianalisis, program $X$ membutuhkan $2 \times 10^{12}$ instruksi untuk mengurutkan 1 juta bilangan. Nilai ini kita dapatkan dari
\[ 2 (10^6)^2 = 2 \times 10^{12} \]
Sementara itu program $Y$ membutuhkan $99,6 \times 10^7$ instruksi, yang didapatkan dari
\[ 50 (1 \times 10^6) \lg (1 \times 10^6) \approx 99,6 \times 10^7 \]
Kalau dihitung waktunya, maka program $X$ dijalankan di komputer $A$ dalam waktu
\[ \frac{2 \times 10^{12} \mathrm{instruksi}}{1 \times 10^{8} \mathrm{instruksi \ per \ detik}} = 20.000 \mathrm{detik} \]
Sementara itu program $Y$ dijalankan di komputer $B$ dalam waktu
\[ \frac{99,6 \times 10^7 \mathrm{instruksi}}{1 \times 10^{6} \mathrm{instruksi \ per \ detik}} = 996,58 \mathrm{detik} \]

Ternyata komputer $B$ yang lebih lambat daripada komputer $A$ menyelesaikan pengurutan 1 juta bilangan sekitar 20 kali lebih cepat. Contoh ini menunjukkan bahwa kecepatan menyelesaikan sebuah permasalahan komputasi bukan hanya ditentukan oleh kecepatan prosesor komputer yang digunakan, tetapi juga dipengaruhi oleh algoritma yang digunakan.

Pertanyaan yang menarik diajukan sampai dengan pembahasan kita di sini adalah bagaimana kita sampai mendapatkan jumlah instruksi dari program $X$ dan program $Y$ dalam bentuk $2 n^2$ dan $50 n \lg n$? Mengapa program $X$ ekspresi jumlah instruksinya berbentuk kuadrat, sedangkan program $Y$ menggunakan fungsi $\lg$ untuk menghitung jumlah instruksi yang dia perlukan?


\section{Algoritme dan Program}

Sebelum kita lanjutkan pembahasan tentang bagaimana menghitung jumlah instruksi yang ada pada sebuah program, kita diskusikan lebih dulu apa itu Algoritme, Pseudocode, dan Program komputer. Setiap program komputer apapun sesungguhnya merupakan kumpulan instruksi yang dijalankan satu per satu oleh prosesor komputer. Pada tingkat bahasa tinggi (\emph{high-level language}), kita membuat program komputer dengan menuliskan barisan-barisan pernyataan. Ketika program ini dikompilasi menjadi bahasa mesin dan kemudian dijalankan oleh prosesor komputer, semua barisan pernyataan yang kita tuliskan itu akan dijalankan satu per satu secara sekuensial.

Pembahasan dalam buku ini kita batasi pada program yang dijalankan di komputer yang hanya memiliki satu prosesor. Pada sistem komputer yang memiliki sepasang prosesor atau lebih, maka instruksi bahasa mesin dari sebuah program bisa dijalankan pada saat yang bersamaan oleh dua prosesor yang tersedia. Namun pada prinsipnya setiap prosesor juga menjalankan setiap instruksi secara berurut mulai dari instruksi pertama hingga instruksi terakhir.

Bohm-Jacopini mengatakan bahwa setiap program komputer sesungguhnya terdiri atas tiga kelompok instruksi.
\begin{description}
  \item[Sekuensial] \index{struktur sekuensial} Kelompok instruksi ini merupakan eksekusi yang dijalankan dalam arsitektur komputer modern. Jika tidak ada instruksi khusus, semua instruksi di dalam program akan dijalankan secara berurut atau sekuensial mulai dari instruksi pertama hingga instruksi terakhir.
  
  \item[Percabangan] \index{struktur percabangan} Kadang kita membutuhkan eksekusi sekuensial jika kondisi tertentu dipenuhi. Jika kondisi tersebut tidak dipenuhi, maka rangkaian instruksi yang lain yang dikerjakan. Setiap kelompok instruksi tetap dijalankan secara sekuensial.
  
  Dalam banyak bahasa pemrograman, struktur percabangan diimplementasikan dalam struktur \index{struktur if-then@struktur \texttt{if-then}} \texttt{if-then} atau \index{struktur if-then-else@struktur \texttt{if-then-else}} \texttt{if-then-else}.
  
  Termasuk di dalam struktur percabangan adalah bentuk pernyataan \index{struktur goto@struktur \texttt{goto}} \texttt{goto}. Dalam perkembangan rekayasa perangkat lunak, struktur \texttt{goto} masih banyak digunakan, namun ternyata menimbulkan banyak masalah dalam pemeliharaan program berukuran besar.
  
  \item[Pengulangan] \index{struktur perulangan} Jika serangkaian instruksi sekuensial perlu dikerjakan berulang-ulang, maka kelompok instruksi ini dimasukkan ke dalam sebuah struktur perulangan. Struktur perulangan sebenarnya dibangun dari sebuah struktur percabangan dan struktur \texttt{goto}.
  
  Dalam beberapa bahasa pemrograman, struktur perulangan diimplementasikan dalam struktur \index{struktur for-loop@struktur \texttt{for-loop}} \texttt{for-loop}, \index{struktur while-loop@struktur \texttt{while-loop}} \texttt{while-loop}, dan \index{struktur do-while-loop@struktur \texttt{do-while-loop}} \texttt{do-while-loop}.
\end{description}

\begin{frame}
  \begin{figure}
  \begin{itemize}
    \item Sekuensial
    \item Percabangan
    \item Perulangan
  \end{itemize}
  \caption{Ringkasan.} \label{fig:coba-ringkasan}
  \end{figure}
\end{frame}

\begin{frame}
%% here
\begin{figure}
\begin{algorithmic}
	\STATE \textsc{BilanganTerbesar} (Data[0..n-1])
	\STATE BilBes \(\leftarrow\) Data[0]
	\FOR{i \(\leftarrow\) 1 \textbf{to} \( n - 1 \)}
		\IF{(BilBes \( < \) Data[i+1])}
			\STATE BilBes \( \leftarrow \) Data[i+1]
		\ENDIF
	\ENDFOR
	\STATE Return BilBes
\end{algorithmic}
\caption{Pseudocode algoritme untuk mencari bilangan terbesar} \label{fig:pseudocode-bilangan-terbesar}
\end{figure}
\end{frame}

Dari pemahaman tersebut, kita bisa lebih mudah menghitung jumlah instruksi dalam sebuah program. Setiap pengerjaan sekuensial dari setiap pernyataan di dalam program akan menyumbang satu pengerjaan instruksi. Jika ada perulangan atau percabangan, maka total jumlah instruksi yang ada di dalam struktur tersebut dihitung sebagai bagian dari total jumlah instruksi yang dilakukan oleh sebuah program.

Biasanya sebuah program dibuat dengan tujuan untuk memecahkan masalah. Tidak semua masalah bisa dipecahkan dengan membuat program. Masalah yang kita bahas di sini, yang bisa dipecahkan dengan membuat programnya, kita sebut sebagai \index{masalah komputasi} \index{computational problems@\emph{computational problems}} masalah komputasi (\emph{computational problems}). Dalam buku ini kita akan membahas berbagai contoh masalah komputasi, di antaranya adalah pengurutan data (\emph{sorting}), pelacakan atau pencarian data (\emph{searching}), dan sebagainya.

Dari sudut pandang Rekayasa Perangkat Lunak, sebuah program sebaiknya dibangun berdasarkan algoritme. Untuk masalah-masalah yang sederhana, misalnya mencari nilai rata-rata dari sekumpulan bilangan, kita memang dapat langsung mengimplementasikan sebuah program. Kasus semacam ini jarang terjadi. Pada kasus mencari nilai rata-rata, sebetulnya kita sudah memiliki algoritme yang ada di dalam kepala kita. Kita sudah tahu bagaimana caranya menghitung nilai rata-rata dari sekumpulan data. Untuk masalah-masalah yang lebih rumit dan kompleks, sebaiknya kita menyusun lebih dulu algoritmenya.

Dari sebuah masalah yang ingin kita pecahkan, langkah-langkah yang sebaiknya dilakukan adalah pertama kali menganalisa masalah tersebut untuk kita susun strategi memecahkan masalah tersebut. Dari analisa ini kita dapat membuat sebuah algoritme. Setelah algoritme tersusun dengan baik, baru kemudian kita dapat mengimplementasikan sebuah program dalam bahasa pemrograman yang tersedia atau yang kita sukai. Selanjutnya kita mengkompilasi program dan menjalankannya untuk mendapatkan solusi atau pemecahan dari masalah komputasi yang diberikan. Urutan langkah ini digambarkan dalam Gambar~\ref{fig:alur-pemecahan-masalah}. Perhatikan bahwa di dalam gambar tersebut ada dua alternatif untuk membuat algoritme, dengan \emph{pseudocode} atau \emph{flowchart}.

\mode<all>{
\begin{figure}
  \begin{center}
    \resizebox*{0.5\textwidth}{!}{\includegraphics{alur-pemecahan-masalah}}
  \end{center}
  \caption{Urutan langkah-langkah yang dilakukan untuk memecahkan masalah komputasi.} \label{fig:alur-pemecahan-masalah}
\end{figure}
}

Dalam praktik dadang-kadang kita diharuskan mengimplementasikan algoritme dalam bahasa pemrograman tertentu. Jika anda menghadapi situasi seperti ini, anda tidak akan kesulitan karena anda sudah menyusun sebuah algoritme yang baik. Algoritme yang baik dapat diterjemahkan menjadi sebuah program dalam bahasa pemrograman apa pun.

Ketika menyusun algoritme, sering kali kita akan melakukan beberapa kali revisi terhadap algoritme tersebut. Hal ini biasanya terjadi karena dalam menganalisa masalah yang diberikan, kita perlahan-lahan memahami detil kerumitan yang dimiliki masalah tersebut. Biasanya ketika seseorang menuliskan atau menggambarkan langkah-langkah untuk memecahkan masalah baru terpikir hal-hal yang seharusnya dilakukan atau justru membuang langkah yang sebelumnya dianggap perlu. Dalam praktiknya perubahan terhadap algoritme adalah sebuah kewajaran dan justru hal ini merupakan hal yang baik. Sebab jika algoritme tersebut sudah diimplementasikan ke dalam program komputer, akan jauh lebih sulit melakukan revisi terhadap program daripada merevisi algoritme.

Mengapa lebih mudah merevisi algoritme? Karena kita membuat algoritme dalam bentuk gambar atau tulisan di atas kertas. Jika ada perubahan pemahaman kita terhadap masalah yang diberikan, kita dapat dengan mudah menghapus atau mencoret bagian algoritme yang sudah kita susun. Jika dianggap perlu kita bisa merapihkan coretan algoritme kita ke lembaran kertas yang baru.

Algoritme bisa dibuat dalam dua bentuk, yaitu \emph{pseudocode} atau \emph{flowchart}. \emph{Pseudocode} atau kode program semu menggambarkan langkah-langkah sistematis yang kita lakukan untuk memecahkan masalah komputasi yang kita hadapi dengan menuliskan langkah-langkah pemecahan masalah dalam baris-baris di atas kertas. Contoh dalam kehidupan sehari-hari bisa kita lihat pada resep memasak mie instan. Urutan langkah untuk memasak mie dimulai dari menyiapkan air di dalam panci, kemudian menyiapkan bumbu, dan seterusnya.

Bentuk lain algoritme adalah diagram alir atau \emph{flowchart}. Kita menyusun langkah-langkah pemecahan masalah menggunakan diagram alir dengan menggambarkan langkah-langkah tersebut, bukan dengan menuliskannya dalam baris-baris seperti dalam \emph{pseudocode}.


\section{Program dan Algoritme}

Program pada umumnya didefinisikan sebagai kumpulan perintah yang dibuat untuk menyelesaikan suatu masalah tertentu. Dalam konteks teknologi komputer program merupakan sesuatu yang dapat dieksekusi dengan menggunakan komputer. Untuk dapat membuat program seorang pemrogram perlu mendefinisikan dahulu apa masalah yang akan dipecahkan dan juga cara penyelesaian masalah tersebut. Uraian langkah-langkah yang jelas dan diperlukan untuk pemecahan masalah disebut sebagai algoritma. Dengan demikian untuk dapat menuliskan suatu program, maka seorang pemrogram terlebih dahulu harus bisa menuliskan algoritma yang diperlukan.

Kinerja suatu algoritma dilihat dari berapa cepatnya algoritma tersebut dalam menyelesaikan masalah. Bila suatu masalah dapat diselesaikan dengan beberapa cara, maka algoritma yang satu dikatakan lebih baik dari yang lain bila waktu pemrosesan program dengan algoritma pertama lebih cepat daripada program yang ditulis berdasarkan algoritma kedua.

Algoritma dapat dituliskan dalam bentuk-bentuk simbol atau diagram yang mempunyai arti tertentu maupun dengan kata-kata yang biasa dipergunakan dalam kehidupan sehari-hari. Penulisan dengan cara pertama disebut sebagai FLOWCHART, sedangkan yang kedua dikenal sebagai PSEUDOCODE. Karena bentuknya yang lebih menyerupai suatu program maka dalam modul ini penulisan algoritma ditulis dalam bentuk pseudocode. 


\section{Pseudocode}

Pseudocode menggunakan kata-kata tertentu untuk merepresentasikan urutan langkah pemecahan masalah. Kata-kata yang dipergunakan tersebut pada umumnya hampir sama maknanya dengan kata-kata kunci yang ada pada bahasa pemrograman. Selain itu dalam pemrograman terstruktur, bentuk penulisan pseudocode mempunyai banyak persamaan dengan bentuk program. Gambar~\ref{fig:pseudocode-bilangan-terbesar} memperlihatkan penulisan algoritma dalam pseudocode untuk pencarian suatu bilangan terbesar. 

\begin{frame}
%% here
\begin{figure}
\begin{algorithmic}
	\STATE \textsc{BilanganTerbesar} (Data[0..n-1])
	\STATE BilBes \(\leftarrow\) Data[0]
	\FOR{i \(\leftarrow\) 1 \textbf{to} \( n - 1 \)}
		\IF{(BilBes \( < \) Data[i+1])}
			\STATE BilBes \( \leftarrow \) Data[i+1]
		\ENDIF
	\ENDFOR
	\STATE Return BilBes
\end{algorithmic}
\caption{Pseudocode algoritme untuk mencari bilangan terbesar} \label{fig:pseudocode-bilangan-terbesar}
\end{figure}
\end{frame}


\section{Teknik Pemrograman}

Bila dahulu pemrograman dapat dipandang sebagai suatu "art", saat ini pemrograman merupakan suatu teknik yang telah mempunyai kaidah-kaidah pemrograman yang sangat membantu para pemrograman. Paradigma terbaru yang dikenal dalam teknik pemrogramanan pada saat ini adalah paradigma yang berorientasi pada obyek (object oriented programming), yang merupakan pengembangan dari teknik pemrograman sebelumnya.

Teknik pemrograman lebih dulu dan masih banyak dipergunakan oleh para pemrogram adalah teknik pemrograman terstruktur (structured programming). Karena pemrograman berorientasi obyek merupakan pengembangan dari pemrograman terstruktur, maka kaidah pemrograman terstruktur ini tetap dipergunakan. Dengan demikian untuk dapat menguasai teknik yang berorientasi pada obyek, seorang pemrograman terlebih dahulu harus tahu teknik pemrograman terstruktur.


\subsection{Pemrograman Terstruktur}

Dalam kehidupan sehari-hari suatu masalah seringkali dapat diselesaikan dengan berbagai cara. Demikian pula halnya masalah yang akan diselesaikan dengan menggunakan komputer, seringkali mempunyai berbagai cara penyelesaian. Namun demikian pada umumnya kita dapat membedakan bahwa dalam hal tertentu cara yang satu lebih baik dari cara yang lain.

Teknik pemrograman terstruktur merupakan suatu teknik pemrograman yang dipercaya dapat memberikan kecepatan dan efisiensi pelaksanaan program yang lebih baik dibandingkan dengan teknik tidak terstruktur (istilah yang diberikan untuk teknik pemrograman yang dilakukan sebelum dikenalnya teknik pemrograman terstruktur). Hal ini disebabkan karena pemrograman terstruktur telah dilengkapi dengan kaidah-kaidah yang dibuat berdasarkan mekanisme atau cara kerja komputer dalam melaksanakan instruksi. Ciri-ciri dari teknik pemrograman terstruktur antara lain adalah:

\begin{itemize}
\item Program dirancang secara top-bottom, yaitu dengan menuliskan langkah-langkah besar dalam pemecahan masalah untuk kemudian merinci menjadi beberapa langkah-langkah yang lebih kecil.
\item Setiap langkah merupakan blok (block) atau struktur (structure) tertentu.
\item Setiap langkah dapat dikategorikan dalam level tertentu. Beberapa langkah yang merupakan rincian dari langkah tertentu mempunyai level yang sama.
\item Setiap blok atau struktur hanya mempunyai satu jalan masuk dan satu jalan keluar.
\item Blok atau struktur yang mempunyai tugas khusus atau seringkali dipergunakan diperlakukan secara khusus dalam bentuk sub program.
\item Tidak ada lonjatan langkah tanpa syarat (unconditional jump).
\end{itemize}

Dengan mengikuti kaidah pada teknik pemrograman terstruktur, maka program yang dihasilkan akan dapat akan dilaksanakan oleh komputer dalam waktu yang lebih cepat dari program yang dibuat tanpa memperhatikan kaidah pemrograman terstruktur.


\subsection{Langkah dalam pemrograman terstruktur}

Suatu permasalahan yang akan diselesaikan dengan cara pemrograman terstrukur akan diuraikan dalam menjadi langkah-langkah pemecahan yang lebih kecil. Dalam setiap penguraian maka hanya akan didapat tiga kemungkinan jenis langkah, yaitu:

\begin{enumerate}
\item Langkah terurut (sequence)

Sekumpulan instruksi yang dilaksanakan urut satu persatu mulai dari yang instruksi pertama, kedua, ketiga, dan seterusnya disebut sebagai langkah terurut (sequence). Suatu masalah yang kompleks pada umumnya tidak cukup hanya diselesaikan dengan langkah terurut saja.

\item Langkah pengambilan keputusan (decision)

Seringkali pelaksanaan suatu langkah memerlukan kondisi/syarat tertentu. Apabila ditemukan kasus dimana sekumpulan intruksi hanya akan dilakukan berdasarkan evaluasi suatu kondisi tertentu, maka langkah yang dilakukan tersebut disebut sebagai langkah pengambilan keputusan. Langkah pengambilan keputusan dapat mempunyai dua alternatif kumpulan instruksi atau lebih yang dapat dipilih berdasarkan kondisi yang harus dievaluasi terlebih dahulu.

\item Langkah pengulangan (repetition)

Seringkali sekumpulan instruksi harus dilaksanakan berkali-kali. Langkah pengulangan merupakan cara untuk melakukan instruksi yang perlu dilakukan secara berulang-ulang. Jumlah pengulangan yang perlu dilakukan dalam langkah pengulangan dapat tertentu maupun tidak tertentu. Dalam hal langkah pengulangan tertentu, instruksi akan dilaksanakan sebanyak jumlah pengulangan yang telah ditentukan, sedangkan bila jumlah pengulangan belum tertentu langkah pengulangan akan dihentikan berdasarkan evaluasi terhadap kondisi penghentian (stopping condition).

\end{enumerate}


\section{Pembuatan Program}

Bila suatu algoritma suatu permasalahan telah dapat dituliskan secara rinci, maka hal berikutnya yang harus dilakukan adalah memilih suatu bahasa pemrograman yang mampu melaksanakan operasi yang diperlukan oleh algoritma tersebut. Dengan pengetahuan syntax dari bahasa pemrograman yang dipilih, setiap langkah rinci algoritma ditulis menjadi kode sumber program (source code) dalam suatu file. Untuk dapat menjalankan program tersebut, file kode sumber tersebut harus diterjemahkan dengan mengunakan penterjemah (translator) bahasa pemrograman menjadi kode biner dalam bentuk executable file yang telah dapat dijalankan pada system operasi.


\section{Dokumentasi Program}

Dalam membuat program seorang pemrogram seringkali menuliskan dahulu rancangan langkah-langkah atau algoritma yang akan dilakukannya. Selanjutnya tulisan/rancangan tersebut dapat dijadikan dokumentasi dari algoritma program yang dibuatnya. Dokumentasi tersebut suatu saat akan berguna untuk mengingatkan kembali apa yang telah dilakukan dan dokumentasi juga dapat dipergunakan untuk dijadikan acuan atau referensi apabila kelak akan melakukan perbaikan/penyempurnaan.

Dalam pembuatan suatu perangkat lunak yang kompleks dan melibatkan banyak orang, dokumentasi algoritma menjadi mutlak diperlukan. Selain untuk pengingat, dokumentasi program berguna sebagai sarana komunikasi antar pelaksana yang terlibat dalam pembuatan perangkat lunak tersebut. Pada umumnya dokumentasi dari program tidak lain merupakan suatu statement yang merupakan komentar yang tidak diterjemahkan oleh penerjemah bahasa pemrograman menjadi kod biner)   dalam program tersebut yang  akan berisi pseudocode atau flowchart yang telah dilengkapi dengan berbagai penjelasan untuk memudahkannya. Bentuk penulisan dokumentasi dari suatu program khususnya yang menggunakan pseudocode akan sangat membantu pembacaan dokumentasi tersebut.


\section{Soal-soal latihan dan bahan diskusi}

\begin{ExerciseList}
  \Exercise Berikan pendapat saudara mengenai kelebihan dan kekurangan penulisan algoritma dalam bentuk  FLOWCHART dan PSEUDOCODE.
  
  \Exercise Tuliskan jenis tiga langkah yang ada dalam pelaksanaan suatu algoritma.
  
  \Exercise Tuliskan persamaan dan perbedaan antara interpreter dengan compiler.
  
  \Exercise Apa yang dimaksud dengan perancangan algoritma/program secara secara top-bottom.
  
  \Exercise Buatlah algoritma untuk mencari bilangan terkecil dari sekumpulan bilangan.
  
  \Exercise Implementasikan algoritma untuk mencari bilangan terbesar dengan menggunakan bahasa pemrograman C.
  
  \Exercise Jelaskan mengapa dokumentasi program diperlukan.
\end{ExerciseList}
